package 中等.双指针;

import java.util.Arrays;

/**
 * 给你一个整数数组 nums ，你的目标是令 nums 中的所有元素相等。
 * 完成一次减少操作需要遵照下面的几个步骤：
 * 找出 nums 中的 最大 值。记这个值为 largest 并取其下标 i
 * （下标从 0 开始计数）。如果有多个元素都是最大值，则取最小的 i 。
 * 找出 nums 中的 下一个最大 值，这个值 严格小于 largest ，记为 nextLargest 。
 * 将 nums[i] 减少到 nextLargest 。
 * 返回使 nums 中的所有元素相等的操作次数。
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode.cn/problems/reduction-operations-to-make-the-array-elements-equal
 */
public class 使数组元素相等的减少操作次数_1887 {

    public static void main(String[] args) {

        System.out.println(reductionOperations(new int[]{1, 3, 5}));

    }

    /**
     * 排序+双指针
     *
     * @param nums
     * @return
     */
    public static int reductionOperations(int[] nums) {
        int count = 0;
        Arrays.sort(nums);

        int right = nums.length - 1;
        while (nums[0] != nums[nums.length - 1]) {
            int left = right;
            // 找到索引最小的最大值
            while (left > 0 && nums[left] == nums[left - 1]) {
                left--;
            }

            int nextLargest = nums[left - 1];
            // 并不需要将 [left,nums.length-1] 全部变成 nextLargest
            nums[nums.length - 1] = nextLargest;
            count += nums.length - left;

            right = left - 1;
        }
        return count;
    }

}
